package com.photography.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.photography.common.Result;
import com.photography.common.JwtTokenUtils;
import com.photography.entity.User;
import com.photography.exception.ErrorCode;
import com.photography.mapper.UserMapper;
import com.photography.service.UserService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.*;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Resource
    private UserMapper userMapper;


    /**
     * 用户登录
     */
    @Override
    public Result login(String account, String password) {
        if (!StringUtils.hasText(account) || !StringUtils.hasText(password)) {
            return Result.error("账号或密码不能为空", ErrorCode.USER_LOGIN_ERROR.getCode());
        }

        User user = userMapper.login(account, password);
        if (user == null) {
            return Result.error("账号或密码错误", ErrorCode.USER_LOGIN_ERROR.getCode());
        }

        // 生成token，添加角色信息
        String token = JwtTokenUtils.getToken(user.getUserId().toString(), user.getPassword(), user.getRole());
        user.setToken(token);


        return Result.success(user, "登录成功");
    }


    /**
     * 用户注册
     */
    @Override
    public Result register(User user) {
        // 参数校验
        if (!StringUtils.hasText(user.getName())) {
            return Result.error("用户名不能为空", ErrorCode.PARAM_EMPTY.getCode());
        }
        if (!StringUtils.hasText(user.getPhoneNumber())) {
            return Result.error("手机号不能为空", ErrorCode.PARAM_EMPTY.getCode());
        }
        if (!StringUtils.hasText(user.getPassword())) {
            return Result.error("密码不能为空", ErrorCode.PARAM_EMPTY.getCode());
        }

        // 检查手机号是否已被注册
        User existUser = this.getOne(
                new QueryWrapper<User>().eq("phone_number", user.getPhoneNumber())
        );
        if (existUser != null) {
            return Result.error("手机号已被注册", ErrorCode.USER_ALREADY_EXIST.getCode());
        }

        //由于手机号是唯一的，所有不需要使用下面的方法
//       List<User> existUser = this.listByMap(
//                Collections.singletonMap("phone_number", user.getPhoneNumber())
//        );
//        if (!existUser.isEmpty()) {
//            return Result.error("该手机号已被注册", ErrorCode.USER_ALREADY_EXIST.getCode());
//        }

       // 检查邮箱是否已被注册
        if (StringUtils.hasText(user.getEmail())) {
            existUser = this.getOne(
                    new QueryWrapper<User>().eq("phone_number", user.getPhoneNumber())
            );
            if (existUser != null) {
                return Result.error("该邮箱已被注册", ErrorCode.USER_ALREADY_EXIST.getCode());
            }
        }

        // 设置注册时间
        user.setRegistrationTime(new Date());

        //设置用户角色
        user.setRole("user");

        // 写入数据库
       boolean result= this.save(user);
       if (result){
           return Result.successWithMsg("注册成功");
       }else {
           return Result.error("注册失败");
       }

    }

    /**
     * 删除用户
     * @param userId 用户id
     * @return 结果
     */
    @Override
    public Result deleteUser(Integer userId) {
        if (userId == null) {
            return Result.error("id不能为空", ErrorCode.PARAM_EMPTY.getCode());
        }
        User user=this.getById(userId);
        if (user==null){
            return Result.error("此用户不存在",ErrorCode.USER_NOT_EXIST.getCode());
        }
        boolean result = this.removeById(userId);

        if (result) {
            return Result.success(null, "删除成功");
        } else {
            return Result.error("删除失败");
        }
    }

    /**
     * 更新用户信息
     * @param user 用户信息
     * @return 结果
     */
    @Override
    public Result updateUser(User user) {
        if (user.getUserId() == null) {
            return Result.error("用户id不能为空", ErrorCode.PARAM_EMPTY.getCode());
        }

        //检查是否有该用户
        User findUser = this.getById(user.getUserId());
        if (findUser == null) {
            return Result.error("用户不存在", ErrorCode.USER_NOT_EXIST.getCode());
        }
        String userRole=JwtTokenUtils.getCurrentRole();
        Integer userId= Objects.requireNonNull(JwtTokenUtils.getCurrentUser()).getUserId();
        if (!userId.equals(user.getUserId())){
            if (!Objects.equals(userRole, "manager")){
                return Result.error("只能修改自己的信息");
            }
        }
        // 检查手机号是否已被注册
        if (StringUtils.hasText(user.getPhoneNumber())) {//先判断是否有电话
            User phoneUser = this.getOne(new QueryWrapper<User>().eq("phone_number", user.getPhoneNumber()));
            if (phoneUser != null && !phoneUser.getUserId().equals(user.getUserId())) {
                return Result.error("该手机号已被其他用户使用", ErrorCode.USER_ALREADY_EXIST.getCode());
            }
        }
       boolean result= this.updateById(user);//updateById(user) 方法会自动忽略 user 对象中的 null 字段
        if (result){
            return Result.success(user,"更新成功");
        }else {
            return Result.error("更新失败");
        }

    }



    /**
     * 分页查询用户列表
     */
    @Override
    public Page<User> getUserPage(Page<User> page, String gender,String userLevel,String search) {
        // 创建查询条件
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();

        // 添加筛选条件
//        if (StringUtils.hasText(name)) {
//            queryWrapper.like(User::getName, name);
//        }
//        if (StringUtils.hasText(email)) {
//            queryWrapper.like(User::getEmail, email);
//        }
//        if (StringUtils.hasText(phoneNumber)) {
//            queryWrapper.like(User::getPhoneNumber, phoneNumber);
//        }
//        if (StringUtils.hasText(nickname)) {
//            queryWrapper.like(User::getNickname, nickname);
//        }
        if (StringUtils.hasText(gender)) {
            queryWrapper.eq(User::getGender, gender);
        }
        if (StringUtils.hasText(userLevel)) {
            queryWrapper.eq(User::getUserLevel, userLevel);
        }
        if (StringUtils.hasText(search)){
            queryWrapper .like(User::getNickname, search)
                    .or()
                    .like(User::getEmail, search)
                    .or()
                    .like(User::getPhoneNumber, search)
                    .or()
                    .like(User::getGender, search)
                    .orderByDesc(User::getRegistrationTime);
        }

        // 按注册时间降序排序
        queryWrapper.orderByDesc(User::getRegistrationTime);

        // 执行分页查询
        return page(page, queryWrapper);
    }

    /**
     * 模糊搜索用户
     */
    @Override
    public Page<User> search(Page<User> page, String keyword) {
        if (!StringUtils.hasText(keyword)) {
            return new Page<>(page.getCurrent(), page.getSize());
        }

        // 创建查询条件
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
                .like(User::getName, keyword)
                .or()
                .like(User::getEmail, keyword)
                .or()
                .like(User::getPhoneNumber, keyword)
                .or()
                .like(User::getGender, keyword)
                .orderByDesc(User::getRegistrationTime);

        // 执行分页查询
        return this.page(page, wrapper);
    }
}
